package com.xjscrm.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Auther: xiaoyuexl
 * @Date: 2023/2/10 19:33
 * @Description: 脱敏处理
 */
public final class DesensitizationUtil {
    public static final String MOBILE_REG = "^\\d{11}$";
    public static final String EMAIL_REG = "@+";
    /**
     * 手机号脱敏
     * @param str
     * @return
     */
    public static String phone(String str) {
        if (StringUtils.isEmpty(str) || (str.length() != 11)) {
            return str;
        }
        return str.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 邮箱脱敏
     * @param str
     * @return
     */
    public static String email(String str) {
        String encrypt = str.replaceAll("(\\w+)\\w{3}@(\\w+)", "$1***@$2");
        if(StringUtils.equalsIgnoreCase(str, encrypt)){
            encrypt = str.replaceAll("(\\w*)\\w{1}@(\\w+)", "$1*@$2");
        }
        return encrypt;
    }

    /**
     * 隐藏字段信息
     * 如果字符长度大于3位，则隐藏最后三位，否则隐藏最后1位
     * @param field
     * @return
     */
    public static String fieldEncrypt(String field) {
        if (StringUtils.isEmpty(field)) {
            return field;
        }
        String encrypt = field.replaceAll("(\\w+)\\w{3}", "$1***");
        if(StringUtils.equalsIgnoreCase(field, encrypt)){
            encrypt = field.replaceAll("(\\w*)\\w{1}", "$1*");
        }
        return encrypt;
    }

    /**
     * 身份证脱敏
     * @param str
     * @return
     */
    public static String idCard(String str) {
        if (StringUtils.isEmpty(str) || (str.length() < 8)) {
            return str;
        }
        return str.replaceAll("(?<=\\w{3})\\w(?=\\w{4})", "*");
    }

    /**
     * 姓名脱敏（第一个字符后的所有字符隐藏）
     * @param str
     * @return
     */
    public static String realName(String str) {
        if (StringUtils.isNotBlank(str)) {
            return str.replaceAll("(?!^)(?<!^.{0}).", "*");
        }
        return null;
    }

    /**
     * 支付宝账号脱敏
     * 手机号：隐藏中间4位
     * 邮箱：如果@前字符长度大于3位，则隐藏最后三位，否则隐藏最后1位
     * @param account
     * @return
     */
    public static String alipayAccount(String account) {
        if (StringUtils.isEmpty(account)) {
            return account;
        }
        Pattern pattern = Pattern.compile(MOBILE_REG);
        Matcher matcher = pattern.matcher(account);
        if(matcher.find()){
            account = DesensitizationUtil.phone(account);
            return account;
        } else {
            pattern = Pattern.compile(EMAIL_REG);
            matcher = pattern.matcher(account);
            if (matcher.find()) {
                account = DesensitizationUtil.email(account);
                return account;
            } else {
                account = DesensitizationUtil.fieldEncrypt(account);
                return account;
            }
        }
    }



}
